package DAO.jpa;

import DAO.UsuarioDAO;
import Modelo.Usuario;

import java.util.List;
import javax.persistence.NoResultException;
import javax.persistence.NonUniqueResultException;
import javax.persistence.Query;
import util.JPAUtil;

public class UsuarioJpaDAO extends AbstractJpaDao<Usuario, Long> implements UsuarioDAO {

    public UsuarioJpaDAO() {
        super(Usuario.class);
    }

    @Override
    public List<Usuario> getAllActives() {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public List<Usuario> getAll() {
        return JPAUtil.getEntityManager().createQuery("from Usuario").getResultList();
    }

    public List<Usuario> getByFilters(Usuario usuario) {

        int filters = 0;

        List<Usuario> retorno = null;

        StringBuilder queryStr = new StringBuilder();

        queryStr.append("SELECT u FROM Usuario u WHERE ");

        if (!isBlank(usuario.getNome())) {
            queryStr.append(" u.nome like :nome ");
            filters++;
        }

        if (!isBlank(usuario.getRg())) {
            
            if (filters > 0) {
                queryStr.append(" OR ");
            }
            
            queryStr.append(" u.rg = :rg ");
            filters++;
        }

        if (!isBlank(usuario.getCpf())) {
            
            if (filters > 0) {
                queryStr.append(" OR ");
            }

            queryStr.append(" u.cpf = :cpf ");
            filters++;
        }

        if (!isBlank(usuario.getMatricula())) {

            if (filters > 0) {
                queryStr.append(" OR ");
            }

            queryStr.append(" u.matricula = :matricula ");
            filters++;
        }

        Query query = JPAUtil.getEntityManager().createQuery(queryStr.toString());

        if (!isBlank(usuario.getNome())) {
            query.setParameter("nome", "%" + usuario.getNome() + "%");
        }
        
        if (!isBlank(usuario.getRg())) {
            query.setParameter("rg", usuario.getRg());
        }

        if (!isBlank(usuario.getCpf())) {
            query.setParameter("cpf", usuario.getCpf());
        }

        if (!isBlank(usuario.getMatricula())) {
            query.setParameter("matricula", usuario.getMatricula());
        }

        retorno = query.getResultList();

        return retorno;
    }

    public Usuario getByPrimaryKey(Usuario usuario) throws NonUniqueResultException, NoResultException {

        Usuario retorno = null;

        StringBuilder queryStr = new StringBuilder();

        queryStr.append(" SELECT u FROM Usuario u WHERE id = :id ");

        Query query = JPAUtil.getEntityManager().createQuery(queryStr.toString());

        query.setParameter("id", usuario.getId());

        retorno = (Usuario) query.getSingleResult();

        return retorno;
    }

    public void insert(Usuario usuarioCorrente) {

        JPAUtil.beginTransaction();

        persist(usuarioCorrente);

        JPAUtil.commitTransaction();
    }

    private boolean isBlank(String str) {
        return (str == null) || (str.trim().equals(""));
    }




//    public List<Aluno> getPorNome(String nome) {
//        String s = "select a from Aluno a where upper(a.nome) like upper(?)";
//        Query query = JPAUtil.getEntityManager().createQuery(s);
//        query.setParameter(1, "%" + nome + "%");
//
//        return (List<Aluno>) query.getResultList();
//    }

//    public Aluno getPorIdComDisciplinas(Long id) {
//        String s = "select a from Aluno a " +
//                   "left outer join fetch a.listaAlunoDisc ad " +
//                   "left outer join fetch ad.disciplina " +
//                   "whusuarios.equals(usuarioCorrente)ere a.id=?";
//        Query query = JPAUtil.getEntityManager().createQuery(s);
//        query.setParameter(1, id);
//
//        return (Aluno) query.getSingleResult();
//    }

//    public Aluno getPorId(Long id) {
//        String s = "select a from Aluno a where a.id=?";
//        Query query = JPAUtil.getEntityManager().createQuery(s);
//        query.setParameter(1, id);
//
//        try {
//            return (Aluno) query.getSingleResult();
//        }
//        catch(NoResultException e) {
//            return null;
//        }
//    }
}